
package com.jf.cloud.product.service;

import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.common.product.dto.ProductSearchDTO;
import com.jf.cloud.common.product.dto.SkuDTO;
import com.jf.cloud.common.product.dto.SpuDTO;
import com.jf.cloud.common.product.vo.SkuAddrVO;
import com.jf.cloud.common.product.vo.SkuVO;
import com.jf.cloud.common.product.vo.SpuSkuAttrValueVO;
import com.jf.cloud.common.product.vo.SpuVO;
import com.jf.cloud.common.product.vo.app.SkuAppVO;
import com.jf.cloud.common.product.vo.search.SpuAdminVO;
import com.jf.cloud.product.dto.StockBillLogItemDTO;
import com.jf.cloud.product.vo.SkuExcelVO;
import com.jf.cloud.product.vo.SpuExcelVO;
import com.jf.cloud.product.vo.SupplierSpuExcelVO;

import java.util.List;
import java.util.Map;

/**
 * sku信息
 *
 * @author zz
 * @date 2020-10-28 15:27:24
 */
public interface SkuService {

    /**
     * 保存sku信息
     * @param spu 商品id
     * @param skuList sku信息
     */
    void save(Long spu, List<SkuDTO> skuList, Integer sysType, Long userId, Long shopId);

    /**
     * 更新sku信息
     * @param spuId spuId
     * @param skuList sku列表信息
     */
    void update(Long spuId, List<SkuDTO> skuList);

    /**
     * 根据sku信息id删除sku信息
     * @param skuId
     */
    void deleteById(Long skuId);

    /**
     *  根据商品id获取商品中的sku列表（将会被缓存起来）
     * @param spuId id
     * @return 返回sku信息
     */
    List<SkuVO> listSkuWithAttrBySpuId(Long spuId);

    /**
     * 根据spuId删除sku信息
     * @param spuId 商品id
     */
    void deleteBySpuId(Long spuId);

    /**
     * 根据skuId获取sku信息
     * @param skuId skuId
     * @return sku信息
     */
    SkuVO getSkuBySkuId(Long skuId);

    /**
     * 根据skuId列表查找库存信息，【赠品】使用无缓存
     * 其他库存查询使用skuStockService
     * @param skuIds
     * @return
     */
    List<SkuVO> getSkuBySkuIds(List<Long> skuIds);

    /**
     * 更新sku金额或者库存信息
     * @param spuDTO
     */
    void updateAmountOrStock(SpuDTO spuDTO);

    /**
     * 获取商品详情需要的的sku列表（包括sku库存信息等）（仅获取启用状态）
     * @param spuVO
     * @return
     */
    List<SkuAppVO> getSpuDetailSkuInfo(SpuVO spuVO);

    /**
     * 获取商品详情需要的的sku列表（包括sku库存信息等）（仅获取启用状态）
     * @param spuIds
     * @return
     */
    List<SkuVO> listBySpuIds(List<Long> spuIds);

    /**
     * 获取供应商sku信息（包含供应商库存和商家库存）
     * @param spuIds
     * @param shopId
     * @return
     */
    List<SkuVO> listSupplierBySpuIds(List<Long> spuIds, Long shopId);

    /**
     * 拼接sku属性信息
     * @param spuSkuAttrValueList
     * @return
     */
    String spliceProperties(List<SpuSkuAttrValueVO> spuSkuAttrValueList);

    /**
     * 从缓存中获取sku的所有信息，包括attr，和库存
     * @param spuId 商品id
     * @param enable 是否是启用状态的sku
     * @return
     */
    List<SkuVO> listSkuAllInfoBySpuId(Long spuId, boolean enable);

    /**
     * 获取excel导出sku数据列表
     * @param spuIds
     * @return
     */
    List<SpuExcelVO> excelSkuList(List<Long> spuIds);

    /**
     * 获取指定sku的价格
     * @param skuIds
     * @return
     */
    List<SkuVO> listSkuPriceByIds(List<Long> skuIds);


    /**
     * 根据skuId列表获取商品订单修改地址所需信息
     * @param skuIds skuId列表
     * @return sku列表
     */
    List<SkuAddrVO> listSpuDetailByIds(List<Long> skuIds);


    /**
     * 根据skuId列表获取售价最低的商品的售价
     * @param skuIds
     * @return
     */
    Long getMinPriceFeeByIds(List<Long> skuIds);

    /**
     * 获取excel导出代销商品sku数据列表
     * @param spuIds
     * @return
     */
    List<SupplierSpuExcelVO> excelSupplierSkuList(List<Long> spuIds);

    /**
     * 导出sku信息
     * @param product
     */
    List<SkuExcelVO> exportSkuList(ProductSearchDTO product);


    /**
     * 根据商品编码获取商品规格列表
     * @param partyCodeList 商品编码
     * @return 商品信息
     */
    List<SkuVO> listByPartyCodeList(List<String> partyCodeList);

    /**
     * 获取代销商品sku
     * @param spu
     * @param enable
     * @return
     */
    List<SkuVO> listConsignmentSku(SpuVO spu, boolean enable);

    /**
     * 根据商品编码和店铺Id获取sku信息
     * @param partyCode
     * @param shopId
     * @return
     */
    StockBillLogItemDTO getSkuByPartyCodeAndShopId(String partyCode, Long shopId);

    /**
     * 获取当前商家的所有sku编码
     * @param shopId
     * @param sysType
     * @param spuId
     * @return
     */
    List<String> listSkuPartyCodesByShopId(Long shopId, Integer sysType, Long spuId);

    /**
     * 供应商SKU变化同步供应商发货的代销商品
     * @param supplierSpuId
     * @return
     */
    void synCommissionSku(Long supplierSpuId);

    /**
     * 获取商品库存预警数量
     * @param product 商品筛选
     * @return
     */
    Integer getStockWarningNum(ProductSearchDTO product);

    /**
     * 异步新增代销商品sku
     * @param spuId
     * @param skuList
     * @param sysType
     */
    void commissionSave(Long spuId, List<SkuDTO> skuList,Integer sysType);

    /**
     * 获取供应商品SKU库存
     * @param spuId
     * @param supplierSpuId
     * @return
     */
    Map<Long,Integer> getSupplierSkuStock(Long spuId,Long supplierSpuId);

    /**
     * 更新sku库存
     * @param skuId
     * @param changeCount
     * @return
     */
    int updateSkuStock(Long skuId, Integer changeCount, Long spuId);

    /**
     * 根据skuId列表获取sku信息列表
     * @param skuIds
     * @return
     */
    List<SkuVO> getByIds(List<Long> skuIds);

    /**
     * 获取商品sku保存到商品列表
     * @param spuAdminVOS
     * @return
     */
    List<SpuAdminVO> setSpuSku(List<SpuAdminVO> spuAdminVOS);


    /**
     * 分页获取sku
     * @param pageDTO
     * @param product
     * @return
     */
    PageVO<SkuVO> pageSku(PageDTO pageDTO, ProductSearchDTO product);

    /**
     * 通过skuIds获取sku列表
     * @param skuIds
     * @return
     */
    List<SkuDTO> listSkuDtoBySkuIds(List<Long> skuIds);
}
